package day1;

import io.lettuce.core.ReadFrom;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Configuration
public class RedisConfig {

    /**
     * 配置redisson的环境。
     * @return
     */
    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456");
        return Redisson.create(config);
    }

    @Resource
    RedissonClient redissonClient;

    //redisson的简单使用。
    public void testRedisson(){
        //指定锁的key，获取一个锁对象。
        RLock lock = redissonClient.getLock("redis:key");
        try {
            //尝试获取锁。在1s钟内，失败可以重试，10s钟自动释放锁。
            boolean b = lock.tryLock(1, 10, TimeUnit.SECONDS);
            lock.lock();
            if(b){
                //获取成功！
                System.out.println("获取成功！");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //释放锁。
            lock.unlock();
        }
    }

    /**
     * 集群的读写分离：
     * ReadFrom类中定义了一些读写策略：
     *  1、MASTER：从主节点读取。
     *  2、MASTER_PREFERRED：优先从主节点读取，主节点不可用，才读取从节点。
     *  3、REPLICA：从从节点读取。
     *  4、REPLICA_PREFERRED：从从节点读取，所有的从节点都不可用了，才从主节点读取。（推荐使用这个）。
     */
    @Bean
    public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
        return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
    }
}
